"""
    类02
"""
from lzm01 import lzm0101
from lzm02 import lzm0201
class MathClass:
    __desc = "这是一个私有类描述"

    #def __new__(cls):
        #print("MathClass new 方法执行，分配内存空间")
        #return super().__new__(cls)

    def __init__(self ,a ,b):  ##构造函数
        self._a = a
        self._b = b
        print("MathClass地址：" , self)
        print(f"MathClass 构造器初始化 a = {self._a} , b =  {self._b}") # >>> 构造器初始化 a = 1 , b =  2

    def t1(self):
        print("这是一个MathClass 的 t1方法")

    def get_desc(self):
        #return MathClass.__desc
        return self.__desc
    # 定义__add方法
    def __test(self):
        print("__test执行")

    @property #加上@property后 不能用 get_a()方法调用
    def a(self):
        print("this get_a")
        return self._a

    @a.setter   #a.setter 需要与@property结合使用 a就表示 property装饰的方法
    def a(self, a):
        self._a = a

    #def add(self):
    #    return self.a + self.b
    #def sub(self):
    #    return self.a - self.b
    #def mul(self):
    #    return self.a * self.b
    #def div(self):
    #    return self.a / self.b

cls = MathClass(1 ,2)
print(cls.get_desc()) # >>> 这是一个私有类描述
print(cls.a) # >>> 1
cls.a = 100
print(cls.a) # >>> 100
print("--------------------------------")
class SubClass(MathClass):  # class C(A, B): 多继承写法
    """SubClass描述""" #只能放在开头，允许开头有空行
    def __new__(cls ,*args,**kwarg):
        print("SubClass new 方法执行，分配内存空间")
        return super().__new__(cls)
    def __str__(self):  # >>> 打印输出信息
        return str(id(self))
    def __init__(self, a, b):
        print("SubClass地址：", self)
        #print(f"SubClass 构造器初始化 a = {self.a} , b =  {self.b}")  # >>> SubClass 构造器初始化 a = None , b =  None
        super().__init__(a, b)
        print(f"SubClass 构造器初始化 a = {self._a} , b =  {self._b}") # >>> SubClass 构造器初始化 a = 1 , b =  2
    def __del__(self): ##析构函数
        print("析构函数执行，数据释放")
    def __call__(self, *args, **kwargs):
        print("obj() 默认调用方法")


    def eat(self):
        super().t1()  # >>> 这是一个MathClass 的 t1方法
        print("吃饭")
    @classmethod
    def cls_method(cls):
        print(cls)  # class  <class '__main__.SubClass'>
        print("这是个类方法")
    @staticmethod
    def static_method():
        print("这是个静态方法")
sub = SubClass(1 , 2)
sub.t1()

#print(sub)
#print(id(sub))
print(dir(sub))  #一些下划线__开头的私有方法也可以通过dir()来获取
print(sub.__dict__) # {'a': 1, 'b': 2} 获取档期当前类的所有方法
print("--------------------------------")
print(dir(object))
print(SubClass.__mro__) # >>> (<class '__main__.SubClass'>, <class '__main__.MathClass'>, <class 'object'>)
SubClass.cls_method() # >>> 这是个类方法
SubClass.static_method() # >>> 这是个类方法
print(type(None)) # >>> <class 'NoneType'>
print(id(None)) # >>> 140712034984432
print(id(None)) # >>> 140712034984432

print("类的描述信息", sub.__doc__)  # >>> 类的描述信息 SubClass描述
print("类的模块信息", lzm0101.__module__) # >>> 类的模块信息 lzm01
print("类的class信息", lzm0101.__class__) # >>> 类的class信息 <class 'lzm01.lzm01'>
sub()

#print(id(lzm0101))  # >>> 1204040826032
#lzm0201.func1() # >>> lzm2 打印 id(lzm01)  1204040826032
